package com.rem.designPattern.abstractFactory抽象工厂;

/**
 * 抽象工厂
 * 提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类
 * <p>
 * 生产点心（咖啡、甜点）的抽象工厂 和具体的工厂实现
 *
 * @author Rem
 * @date 2022-11-14
 */
public interface SnackFactory {

    /**
     * 生产咖啡的功能
     *
     * @return
     */
    Coffee createCoffee();

    /**
     * 生产甜品的功能
     *
     * @return
     */
    Dessert createDessert();
}

/**
 * 意大利点心工厂 生产拿铁咖啡和提拉米苏
 */
class ItalySnackFactory implements SnackFactory {

    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }

    @Override
    public Dessert createDessert() {
        return new Trimisu();
    }
}

/**
 * 美国点心工厂 生产美式咖啡和抹茶慕斯
 */
class AmericanSnackFactory implements SnackFactory {

    @Override
    public Coffee createCoffee() {
        return new AmericanCoffee();
    }

    @Override
    public Dessert createDessert() {
        return new MatchaMousse();
    }
}